/*
 * @brief gl 2D text processing (implementation file)
 *
 * @note
 * Copyright(C) NXP Semiconductors, 2015
 * All rights reserved.
 *
 * @par
 * Software that is described herein is for illustrative purposes only
 * which provides customers with programming information regarding the
 * LPC products.  This software is supplied "AS IS" without any warranties of
 * any kind, and NXP Semiconductors and its licensor disclaim any and
 * all warranties, express or implied, including all implied warranties of
 * merchantability, fitness for a particular purpose and non-infringement of
 * intellectual property rights.  NXP Semiconductors assumes no responsibility
 * or liability for the use of the software, conveys no license or rights under any
 * patent, copyright, mask work right, or any other intellectual property rights in
 * or to any products. NXP Semiconductors reserves the right to make changes
 * in the software without notification. NXP Semiconductors also makes no
 * representation or warranty that such application will be suitable for the
 * specified use without further testing or modification.
 *
 * @par
 * Permission to use, copy, modify, and distribute this software and its
 * documentation is hereby granted, under NXP Semiconductors' and its
 * licensor's relevant copyrights in the software, without fee, provided that it
 * is used in conjunction with NXP Semiconductors microcontrollers.  This
 * copyright, permission, and disclaimer notice must appear in all copies of
 * this code.
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#include "trace.h"
#include "gl_text.h"

/*****************************************************************************
 * Public types/enumerations/variables
 ****************************************************************************/

/*****************************************************************************
 * Private types/enumerations/variables
 ****************************************************************************/
static int 		width;															/* Current window width */
static int 		height;															/* Current window height */

/*****************************************************************************
 * Private functions
 ****************************************************************************/

/**
 * @brief
 * @return	Nothing
 */
static void setOrthographicProjection()
{
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	gluOrtho2D(0, width, 0, height);
	glScalef(1, -1, 1);
	glTranslatef(0, -height, 0);
	glMatrixMode(GL_MODELVIEW);
}

/**
 * @brief
 * @return	Nothing
 */
static void setPerspectiveProjection()
{
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();
	glMatrixMode(GL_MODELVIEW);
}

/*****************************************************************************
 * Public functions
 ****************************************************************************/

/**
 * @brief
 * @return	Nothing
 */
void gl_text_init(int w, int h)
{
	width = w;
	height = h;
}

/**
 * @brief
 * @return	Nothing
 */
void gl_text_update(int w, int h)
{
	width = w;
	height = h;
}

/**
 * @brief
 * @return	Nothing
 */
void gl_text_begin(void)
{
	setOrthographicProjection();
	glPushMatrix();
	glLoadIdentity();
}

/**
 * @brief
 * @return	Nothing
 */
void gl_text_end(void)
{
	glPopMatrix();
	setPerspectiveProjection();
}

/**
 * @brief
 * @return	Nothing
 */
void gl_text_info_init(TEXT_INFO_T* t_info)
{
	t_info->font.font = GLUT_BITMAP_9_BY_15;
	t_info->font.h = 16;
	t_info->font.w = 10;

	t_info->pos.x = 5;
	t_info->pos.y = 16;

	t_info->color.r = 1.0f;
	t_info->color.g = 1.0f;
	t_info->color.b = 1.0f;
}

/**
 * @brief
 * @return	Nothing
 */
void gl_text_print(TEXT_INFO_T* t_info, const char *string)
{
	const char *c;

	glDisable(GL_LIGHTING);														/* disable lighting (so color will work) */
	glRasterPos2f(t_info->pos.x, t_info->pos.y);								/* set position */
	glColor3f(t_info->color.r, t_info->color.g, t_info->color.b);				/* set color */
	for (c=string; *c != '\0'; c++) {											/* render the string */
		glutBitmapCharacter(t_info->font.font, *c);								/* character by character */
	}
	t_info->pos.y += t_info->font.h;											/* move to next line */
	glEnable(GL_LIGHTING);														/* enable lighting (so everything else will look good */
}

void gl_text_blank(TEXT_INFO_T* t_info)
{
	t_info->pos.y += t_info->font.h;											/* move to next line */
}
